# -*-coding:utf-8-*-
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.axes._subplots import Axes
from matplotlib import ticker

plt.rcParams['font.sans-serif'] = ['KaiTi']  # 解决中文乱码问题
plt.rcParams['axes.unicode_minus'] = False  # 解决负号不显示问题
pd.set_option('display.unicode.east_asian_width', True)


def example_1():
    # 对比分析各品牌汽车销量TOP10
    data: pd.DataFrame = pd.read_excel('car.xlsx')
    top10 = data.sort_values('1月销量', ascending=False, ignore_index=True).head(10)
    plt.title('2020年1月国产品牌汽车销售TOP10', fontsize=16)
    plt.subplots_adjust(left=0.2)
    plt.tick_params(left=None)
    plt.barh(top10['车型'], top10['1月销量'], alpha=0.6)
    for x, y in zip(top10.index, top10['1月销量']):
        plt.text(y / 2, x, y, va='center', ha='center')
    plt.show()


def example_2():
    # 销量同比增长情况分析
    data: pd.DataFrame = pd.read_excel('car.xlsx', sheet_name=1)
    data = data.loc[data['商品名称'] == '零基础学Python（全彩版）',
                    ['北京', '上海', '广州', '成都', '武汉', '沈阳', '西安', '日期']]
    data.set_index('日期', inplace=True)
    data2 = pd.concat([data.loc['2019-02'], data.loc['2020-02']]).T
    data2.columns = ['2019年2月', '2020年2月']
    data2['同比增长率'] = (data2['2020年2月'] - data2['2019年2月']) / data2['2019年2月'] * 100

    bar_width = 0.4
    plt.title('全国各地区销量及同比增长情况', fontsize=16)
    plt.xlabel('地区')
    plt.ylabel('销售数量（册）')
    x = np.arange(len(data2.index))
    plt.xticks(x + bar_width / 2, data2.index)
    plt.bar(x, data2['2019年2月'], width=bar_width, label='2019年2月')
    plt.bar(x + bar_width, data2['2020年2月'], width=bar_width, label='2020年2月')
    plt.legend()
    for x, y in zip(x + bar_width / 2, data2['同比增长率']):
        plt.text(x, y, '{:.2f}%'.format(y), ha='center')
    plt.show()


def example_3():
    # 销量环比增长情况分析
    data: pd.DataFrame = pd.read_excel('car.xlsx', sheet_name=1)
    data = data.loc[data['商品名称'] == '零基础学Python（全彩版）',
                    ['北京', '上海', '广州', '成都', '武汉', '沈阳', '西安', '日期']]
    data2: pd.DataFrame = data.set_index('日期').loc['2019'].sort_index()
    data2['总销量'] = data2.sum(axis=1)
    data2['环比增长率'] = (data2['总销量'] - data2['总销量'].shift().bfill()) / data2['总销量'] * 100

    xlabel = [str(i) + '月' for i in range(1, 13)]
    ax1: Axes = plt.figure().add_subplot(1, 1, 1)
    ax1.set_title('2019年销量及环比增长情况', fontsize=16)
    ax1.set_xlabel('月份')
    ax1.set_ylabel('销售数量（册）')
    ax1.bar(xlabel, data2['总销量'], color='#009db2', label='2019年销量')
    ax2: Axes = ax1.twinx()
    ax2.set_ylabel('增长率')
    ax2.set_ylim(-100, 100)
    ax2.yaxis.set_major_formatter(ticker.PercentFormatter(decimals=2))  # y轴坐标显示为百分比形式
    ax2.plot(xlabel, data2['环比增长率'], color='#f06464', linestyle='-', marker='o', mfc='w', label='2019年环比增长率')
    for x, y in zip(range(12), data2['环比增长率']):
        plt.text(x, y + 5, '{:.2f}%'.format(y), ha='center')
    # 设置图例
    lines1, labels1 = ax1.get_legend_handles_labels()
    lines2, labels2 = ax2.get_legend_handles_labels()
    ax2.legend(lines1+lines2, labels1+labels2)
    plt.subplots_adjust(right=0.85)
    plt.show()


if __name__ == '__main__':
    example_3()
